1. /* primetbl.cpp by K.Tsuru */
  2. // since ver 2.181
  3. #ifndef TOOLS_H
  4. #include "tools.h"
  5. #endif // TOOLS_H
  6. /***************************
  7. The number of prime under N.
  8. ****************************/
  9. #if 0
  10. ulong PrimeNumberUnder(ulong N){ // slow N > 10^8
  11. bool isPrime = false;
  12. long i, j, count = 2; // 2 and 3
  13. // start at 5
  14. for (i = 5; i <= N; i += 2) {
  15. for (j = 2; j * j <= i; j++) {
  16. if (i % j == 0) {
  17. isPrime = false;
  18. break;
  19. }
  20. isPrime = true;
  21. }
  22. if (isPrime) count++;
  23. }
  24. return count;
  25. }
  26. #else
  27. /********************************************************
  28. The rough estimate value for the number of prime under N.
  29. pi(x) ~ x/ln(x) (Prime number theorem)
  30. *********************************************************/
  31. ulong PrimeNumberUnder(ulong N){
  32. double f, L = log10((double)N);
  33. int m = L+0.01;// to integer
  34. if(m <= 5) f=1.17;
  35. else if(m <= 6) f=1.11;
  36. else if(m <= 8) f = 1.073;
  37. else if(m <=10) f = 1.055;
  38. else if(m <=12) f = 1.045;
  39. else f= 1.04;
  40. double p = log(N);
  41. double M = f*double(N)/p;
  42. return (ulong)M;
  43. }
  44. #endif
  45. /****************************************
  46. It makes the prime table between 2 and n
  47. using the sieve of Eratosthenes.
  48. *****************************************/
  49. ulong MakePrimeTable(NCBlock <ulong>& table, const ulong n) {
  50. ulong count = 0;
  51. ulong M = (n - 3)/2; // from 2M+3 <= n see (*) below
  52. while(2*M + 3 > n) M--;
  53. bool* flag = new bool[M+1]; // sizeof(bool) = 1 (byte)
  54. ulong ts = PrimeNumberUnder(n); // table size
  55. table.size(ts+1, 0);
  56. table[count] = 2; count++;
  57. ulong i, k, p;
  58. for (i = 0; i <= M; i++) flag[i] = true;
  59. for (i = 0; i <= M; i++) {
  60. if (flag[i]) {
  61. p = 2 * i + 3; // (*) p<n
  62. table[count] = p;
  63. for (k = i + p; k <= M; k += p) flag[k] = false;
  64. count++;
  65. }
  66. }
  67. table[count] = 0; // set last element = 0
  68. delete[] flag;
  69. return count;
  70. }

primetbl.cpp : last modifiled at 2017/12/20 11:00:18(1,907 bytes)
created at 2016/04/11 11:17:20
The creation time of this html file is 2017/12/20 15:49:57 (Wed Dec 20 15:49:57 2017).